import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:flustars/flustars.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';

extension StringExtension on String {
  // 自己的校验空
  bool get checkEmpty {
    return Utils.isEmpty(this);
  }

  // 自己的校验非空
  bool get checkNotEmpty {
    return Utils.isNotEmpty(this);
  }
}

class Utils {
  /// 是否字符串为空
  static bool isEmpty(String? value) {
    if (value == null) {
      return true;
    }
    return value.isEmpty || value == 'null';
  }

  /// 字符串是否不为空
  static bool isNotEmpty(String? value) {
    return !isEmpty(value);
  }

  /// 判断邮箱
  static isEmail(dynamic value, {String? country = "sg"}) {
    switch (country) {
      case "sg":
        RegExp regExp = RegExp(r"^\w{1,}(.\w+)*@[A-z0-9]+(\.[A-z]{2,6}){1,2}$");
        if (regExp.hasMatch(value.toString())) {
          return true;
        } else {
          return false;
        }
      default:
        return false;
    }
  }

  /// 判断中国的11位手机号码
  static bool isChinaPhoneNumber(dynamic value) {
    RegExp regExp = RegExp(r"^1\d{10}$"); // 匹配以1开头的11位数字
    if (regExp.hasMatch(value.toString())) {
      return true;
    } else {
      return false;
    }
  }

  /// 全局的路由key
  static final navKey = GlobalKey<NavigatorState>();

  /// 全局的组件key
  static final widgetKey = GlobalKey<State>();

  //页面缓存key
  static dynamic pageStorageKey(dynamic keyname) {
    return PageStorageKey<dynamic>(keyname);
  }

  /// 关闭软键盘
  static void hideKeyboard(BuildContext context) {
    FocusScopeNode currentFocus = FocusScope.of(context);
    if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
      FocusManager.instance.primaryFocus!.unfocus();
    }
  }

  /// map 转 json 字符串
  static String encodeMap(Map<String, dynamic> mapData) {
    return json.encode(mapData);
  }

  /// json 字符串转 map
  static Map<String, dynamic> decodeJson(jsonStr) {
    return json.decode(jsonStr.toString());
  }

  /// 判断颜色是否是暗色还是亮色
  static num getComputeLuminance(Color color) {
    return color.computeLuminance();
  }

  /// 随机获取指定返回内的数值
  static int getRandomRangeInt(int min, int max) {
    final Random random = Random();
    return min + random.nextInt(max + 1 - min);
  }

  /// 无参数的防抖函数
  static VoidCallback debounce(
    VoidCallback func, [
    Duration delay = const Duration(milliseconds: 400),
  ]) {
    late Timer timer;
    return () {
      if (timer.isActive == true) {
        timer.cancel();
      }
      timer = Timer(delay, () {
        func.call();
      });
    };
  }

  /// 带参数的防抖函数
  static Function debounceArg<T>(
    Function func, [
    Duration delay = const Duration(milliseconds: 2000),
  ]) {
    late Timer timer;
    return (T arg) {
      if (timer.isActive == true) {
        timer.cancel();
      }
      timer = Timer(delay, () {
        func.call(arg);
      });
    };
  }

  /// 根据现在的小时数，返回 早上好，中午好，下午好，晚上好 这四个字符串
  static String formatNowGreetingText(){
    final now = DateTime.now();
    final hour = now.hour;
    String greeting;
    if (hour < 11) {
      greeting = '早上好';
    } else if (hour < 13) {
      greeting = '中午好';
    } else if (hour < 18) {
      greeting = '下午好';
    } else if (hour < 24) {
      greeting = '晚上好';
    } else {
      greeting = '早上好';
    }
    return greeting;
  }

  /// 清除 app/data/packageName/cache 目录下的缓存文件
  /// 使用的第三方框架 DirectoryUtil 来管理的 PathProviderPlatform
  static Future<void> clearAppCache() async {
    final cacheDir = await DirectoryUtil.initTempDir();
    if (cacheDir != null) {
      if (await cacheDir.exists()) {

        //遍历删除 Cache 目录下面的全部文件或文件夹
        for (final entity in cacheDir.listSync()) {
          // 如果是文件直接删除
          if (entity is File) {
            await entity.delete();
          }
          // 如果是目录则递归删除
          else if (entity is Directory) {
            //使用recursive参数会遍历文件夹下面的文件
            await entity.delete(recursive: true);
          }
        }

      }
    }
  }

  /// 获取缓存 app/data/packageName/cache 目录下的缓存文件夹大小
  /// 使用的第三方框架 DirectoryUtil 来管理的 PathProviderPlatform
  static Future<int> getAppCacheSize() async {
    int size = 0;

    final cacheDir = await DirectoryUtil.initTempDir();
    if (cacheDir != null) {
      if (await cacheDir.exists()) {

        //遍历删除 Cache 目录下面的全部文件或文件夹 ,（使用recursive参数会遍历文件夹下面的文件出来）
        final List<FileSystemEntity> files = cacheDir.listSync(recursive: true);

        for (final entity in files) {
          if (entity is File) {
            size += await entity.length();
          }
        }
      }
    }

    return size;
  }

  /// 转换字节数组大小，按顺序展示 GB MB KB
  static String formatBytes(int bytes) {
    const int KB = 1024;
    const int MB = KB * 1024;
    const int GB = MB * 1024;

    if (bytes >= GB) {
      final gigabytes = (bytes / GB).toStringAsFixed(2);
      return '$gigabytes GB';
    } else if (bytes >= MB) {
      final megabytes = (bytes / MB).toStringAsFixed(2);
      return '$megabytes MB';
    } else if (bytes >= KB) {
      final kilobytes = (bytes / KB).toStringAsFixed(2);
      return '$kilobytes KB';
    } else {
      return '$bytes B';
    }
  }

}
